草庐IT

c++ - Lua C++ 表迭代

全部标签

c++ - 基于指针的基本随机访问迭代器的代码?

我从未实现过类似STL的迭代器,我试图理解如何基于指针实现一个非常基本的东西。一旦我有了这个类,我就可以修改它来做更复杂的事情。因此,这是第一步,我需要它坚如磐石才能理解如何编写我自己的迭代器(不使用boost)。我写了下面的代码,我知道里面有错误。你能帮我正确设计一个受此启发的随机访问迭代器类吗:templateclassContainer::Iterator:publicstd::iterator{//Lifecycle:public:Iterator():_ptr(nullptr){;}Iterator(Type*rhs):_ptr(rhs){;}Iterator(constIt

c++ - 为什么在隐式共享容器上使用迭代器时必须先复制?

Qt的文档说明如下:Thankstoimplicitsharing,itisveryinexpensiveforafunctiontoreturnacontainerpervalue.TheQtAPIcontainsdozensoffunctionsthatreturnaQListorQStringListpervalue(e.g.,QSplitter::sizes()).IfyouwanttoiterateovertheseusinganSTLiterator,youshouldalwaystakeacopyofthecontaineranditerateoverthecopy.Fo

c++ - 在 C++ 中,为什么我们不能使用 > 和 < 来比较迭代器?

这个问题在这里已经有了答案:Whyis"!="usedwithiteratorsinsteadof"(2个答案)关闭6年前。有人问我这个问题,我真的不知道为什么。如果你有一个指针int*x;您可以将指针与>进行比较和因为它代表内存位置,类似于0x00000x00040x0008等。我知道迭代器和指针是不同的,但它们的行为方式非常相似。例如:vectormyVector;for(inti=1;i::iteratorit=myVector.begin();while(it!=myVector.end())//Whycan'twewriteit为什么我们不能写它在while陈述?我知道这与S

c++ - 在特定条件下跳过 std::for_each 中的迭代

我正在开发一个需要遍历范围的程序。我想知道我是否可以像在基于范围的for循环中使用时那样使用continue。工作:std::vectorv={"foo","bar","baz","foobar"};for(autos:v){if(*s.front()=='b')continue;std::cout不工作:std::vectorv={"foo","bar","baz","foobar"};std::for_each(v.begin(),v.end(),[](conststd::string&s){if(*s.front()=='b')continue;std::cout

C++ 使用 boost fusion adapt_struct 迭代到嵌套结构字段

两个stackoverflowanswers建议使用融合adapt_struct迭代结构字段的方法。该方法看起来不错。但是,如何迭代到本身是结构的字段?根据前面的答案,我想出了下面的代码。问题出在代码无法编译的“#if0”子句处。作为替代解决方案,我创建了“decode()”函数来获取指向目标参数的空指针。这行得通,但在编译时丢失了类型信息。有更好的解决方案吗?structFoo_s{inti;};BOOST_FUSION_ADAPT_STRUCT(Foo_s,(int,i))structBar_s{intv;Foo_sw;};BOOST_FUSION_ADAPT_STRUCT(Bar

c++ - 使用索引避免迭代器失效,保持干净的界面

我创建了一个MemoryManager类,它基本上是两个指针vector的包装器,它们管理堆分配对象的生命周期。一个vector存储“活着的”对象,另一个存储将在下一次添加的对象MemoryManager::refresh.选择此设计是为了避免在遍历MemoryManager时迭代器失效,将新对象直接添加到MemoryManager::alivevector可以使现有的迭代器无效(如果它的大小增加)。templatestructMemoryManager{std::vector>alive;std::vectortoAdd;T&create(){autor(newT);toAdd.pu

c++ - 将 vector 迭代器转换为指针

有什么方法可以将vector::iterator转换为指针而无需访问vector本身?这仅在vector可用时有效:typedefvectorV;int*to_pointer1(V&v,V::iteratort){returnv.data()+(t-v.begin());}但是如果没有vector如何做到这一点呢?这行不通:int*to_pointer2(V::iteratort){//theobviousapproachdoesn'tworkfortheenditeratorreturn&*t;}事实上,我本以为这是一个非常基本和流行的问题,但由于某种原因我找不到它。

c++ - 如何跳过基于范围的 for 循环的第一次迭代?

我想做这样的事情:for(intp:colourPos[i+1])如何跳过colourPosvector的第一次迭代?我可以使用.begin()和.end()吗? 最佳答案 自C++20您可以使用范围适配器std::views::drop来自Rangeslibrary连同range-basedforloop用于跳过第一个元素,如下所示:std::vectorcolourPos{1,2,3};for(intp:colourPos|std::views::drop(1)){std::cout输出:Pos=2Pos=3CodeonWand

c++ - 为什么将不存在的键应用于 map::find 会在 C++ 中返回具有第一个值映射大小的迭代器?

我有一个类似下面代码片段的用例,在getter返回的映射中使用map::find来查找不存在的键实际上会找到一个迭代器,其第一个值是map(可能),因此不会像预期的那样运行,等于map::end这可能是因为我的map是getter返回的map。并在不将其分配给变量的情况下使用了map。这样getter返回值可能已经被立即销毁了。那么如果我的猜测是正确的呢?为什么它返回map的大小而不是它的结束迭代器?#include#includeclassB{longlongid_;public:B()=default;explicitB(longlong);~B()=default;};B::B(

C++ 字符串迭代器

我试图在一个循环中使用迭代器在字符串上执行if语句,但无法弄清楚如何获取if语句的当前字符:for(std::string::iteratori=buffer.end()-1;i>=buffer.begin();--i){if(!isalpha(*i)&&!isdigit(*i)){if(i!="-"){//obviouslythisiswrongbuffer.erase(i);}}}谁能帮我获取当前字符,这样我就可以做一些额外的if语句? 最佳答案 Ican'tfigureouthowtogetthecurrentcharacte